<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>23_reduce数组统计</title>
</head>

<body>
  <script>
    var names = ['Jack', 'Tom', 'Rose', 'Tom', 'Jack'];

    var totalNames = names.reduce(function a(allNames, name) {

      // in 操作符用来判断属性是否存在于对象中, 无论该属性存在于实例中还是原型中.
      // name 是否存在 allNames对象中
      if (name in allNames) {
        allNames[name]++;
      } else {
        allNames[name] = 1;
      }
      return allNames;
    }, {});
    console.log(totalNames);


    /**
     * reduce 原理
     *    1. 准备了一个初始值, 按照你传递的第二个参数来定
     *      var obj = {};
     *    2. 根据原始数组了调用 a 函数
     *      => 第一次调用 a({},  Jack),                         return {Jack: 1},                   把 返回值再次赋值给 obj
     *      => 第二次调用 a({Jack: 1}, Tom),                    return {Jack: 1, Tom: 1},           把 返回值再次赋值给 obj
     *      => 第三次调用 a({Jack: 1, Tom: 1}, Rose)            return {Jack: 1, Tom: 1, Rose: 1},  把 返回值再次赋值给 obj
     *      => 第四次调用 a({Jack: 1, Tom: 1, Rose: 1}, Tom)    return {Jack: 1, Tom: 2, Rose: 1},  把 返回值再次赋值给 obj
     *      => 第五次调用 a({Jack: 1, Tom: 2, Rose: 1}, Jack),  return {Jack: 2, Tom: 2, Rose: 1},  把 返回值再次赋值给 obj
    */
  </script>
</body>

</html>